package jp.co.neosystem.adwg.neodiary.db.util;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import android.database.sqlite.SQLiteDatabase;

/**
 * Whereマップクラス
 * 
 * @author NEOSystem
 */
public class WhereMap
{
	/** Whereマップ */
	private Map<String, String> whereMap = new LinkedHashMap<String, String>();

	/**
	 * 条件データ設定
	 * 
	 * <pre>
	 * 引数の何れかがnull、または空だった場合、Whereマップへの設定は行わない
	 * </pre>
	 * 
	 * @param column 条件対象カラム
	 * @param value 条件対象カラムの値
	 */
	public void put(String column, String value)
	{
		if (StringUtils.isEmpty(column) || StringUtils.isEmpty(value))
		{
			return;
		}
		
		whereMap.put(column, value);
	}

	/**
	 * 条件データ取得
	 * 
	 * @param column 条件対象カラム
	 * @return 条件対象カラムの値
	 */
	public String get(String column)
	{
		return whereMap.get(column);
	}

	/**
	 * Where句を取得
	 * 
	 * <pre>
	 * Whereマップの内容よりWhere句を作成し、それを戻り値とする。
	 * 例えば、カラム「aaa」、「bbb」、「ccc」がマップに設定されていた場合、
	 * 
	 * "WHERE aaa=? AND bbb=? AND ccc=?
	 * 
	 * という文字列が戻り値となる。
	 * 
	 * {@link SQLiteDatabase#query}のWhere対象カラムを指定する引数にて利用するため、
	 * 条件対象カラムの値部分については、プレースホルダ (?) としている。
	 * 
	 * </pre>
	 * 
	 * @return Where句
	 */
	public String getWhere()
	{
		int keySetSize = whereMap.keySet().size();
		if (keySetSize == 0)
		{
			return "";
		}

		StringBuilder where = new StringBuilder();
		Iterator<String> iterator = whereMap.keySet().iterator();
		while (iterator.hasNext())
		{
			String whereColumn = iterator.next();
			where.append(whereColumn).append("=").append("?");

			if (iterator.hasNext())
			{
				where.append(" AND ");
			}
		}

		return where.toString();
	}

	/**
	 * Where句の条件対象カラムの値を取得
	 * 
	 * <pre>
	 * Whereマップの内容より条件対象カラムの値の配列を作成し、それを戻り値とする。
	 * </pre>
	 * 
	 * @return Where句 Where句の条件対象カラム
	 */
	public String[] getWhereValues()
	{
		int keySetSize = whereMap.keySet().size();
		if (keySetSize == 0)
		{
			return null;
		}

		List<String> values = new ArrayList<String>();
		Iterator<String> iterator = whereMap.keySet().iterator();
		while (iterator.hasNext())
		{
			values.add(this.get(iterator.next()));
		}
		
		return (String[]) values.toArray(new String[]{});
	}
	
	/**
	 * データダンプ
	 * 
	 * @return ダンプデータ
	 */
	@Override
	public String toString()
	{
		return whereMap.toString();
	}
}
